package org.practice.interceptor;

import org.apache.commons.lang.StringUtils;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.util.ValueStack;
/**
 * struts2 interceptor基于aop设计模式
 * invocation.invoke(),这是ActionInvocation中的方法，而ActionInvocation是Action调度者，所以这个方法具备以下2层含义： 

1. 如果拦截器堆栈中还有其他的Interceptor，那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。 

2. 如果拦截器堆栈中只有Action了，那么invocation.invoke()将调用Action执行。 

 */
public class OgnlInterceptor extends MethodFilterInterceptor {
	private int max;
	
	//拦截器：拦截在视图层(view)之前,ActionInvocation封装了对Action的调用信息
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		// .......织入代码开始...........
		ValueStack stack = invocation.getStack();
		String name = stack.findString("name");
		System.out.println("inteceptor:" + name);
		stack.setValue("name", StringUtils.repeat(name+"\t", max));
		// .......织入代码结束...........
		//查找链栈中有没有拦截器，如果有则调用下一个拦截器，否则调用action
		String result = invocation.invoke();
		//中止整个执行，直接返回一个字符串 
		return result;
	}
	
	public int getMax() {
		return max;
	}

	public void setMax(int max) {
		this.max = max;
	}
}
